/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package es.uned.modelo;

import es.uned.controlador.PacmanSound;
import es.uned.controlador.PacmanUtils;
import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

/**
 *
 * @author gabriel manzano merida
 */
public class Pacman extends Personaje {

    private int puntos = 0;
//    private int x = 10, y = 15;
    //imagenes de pacman en movimiento
    private String pacmanRight = PacmanUtils.PACMAN_RIGHT_PATH;
    private Image imageR;
    private String pacmanLeft = PacmanUtils.PACMAN_LEFT_PATH;
    private Image imageL;
    private String pacmanUp = PacmanUtils.PACMAN_UP_PATH;
    private Image imageU;
    private String pacmanDown = PacmanUtils.PACMAN_DOWN_PATH;
    private Image imageD;
    //imagenes de pacman ko
    private String pacmanKoRight = PacmanUtils.PACMAN_KO_RIGHT_PATH;
    private Image imageKoR;
    private String pacmanKoLeft = PacmanUtils.PACMAN_KO_LEFT_PATH;
    private Image imageKoL;
    private String pacmanKoUp = PacmanUtils.PACMAN_KO_UP_PATH;
    private Image imageKoU;
    private String pacmanKoDown = PacmanUtils.PACMAN_KO_DOWN_PATH;
    private Image imageKoD;
    //imagen de pacman gameover
    private String pacmanRip = PacmanUtils.PACMAN_RIP_PATH;
    private Image imageRip;
    private Image imagenActual;
    private boolean invulnerable = false;
    private int tInvulnerable = 0;
    private boolean ok = true, gameOver = false, winner=false;
    private int vidas = 2;

    /**
     * TODO Pacman se iniciará en la posición... x,y con 0 puntos, y carga todas
     * las imagenes
     *
     * @param puntos
     */
    public Pacman(int puntos, int x, int y) {
        //pacman ok--------
        //pacman derecho
        ImageIcon iiPR = new ImageIcon(this.getClass().getResource(pacmanRight));
        imageR = iiPR.getImage();
        //pacman izquierdo
        iiPR = new ImageIcon(this.getClass().getResource(pacmanLeft));
        imageL = iiPR.getImage();
        //pacma arriba
        iiPR = new ImageIcon(this.getClass().getResource(pacmanUp));
        imageU = iiPR.getImage();
        //pacma abajo
        iiPR = new ImageIcon(this.getClass().getResource(pacmanDown));
        imageD = iiPR.getImage();

        //pacman ko-----
        iiPR = new ImageIcon(this.getClass().getResource(pacmanKoRight));
        imageKoR = iiPR.getImage();
        //pacman izquierdo
        iiPR = new ImageIcon(this.getClass().getResource(pacmanKoLeft));
        imageKoL = iiPR.getImage();
        //pacma arriba
        iiPR = new ImageIcon(this.getClass().getResource(pacmanKoUp));
        imageKoU = iiPR.getImage();
        //pacma abajo
        iiPR = new ImageIcon(this.getClass().getResource(pacmanKoDown));
        imageKoD = iiPR.getImage();

        //rip
        iiPR = new ImageIcon(this.getClass().getResource(pacmanRip));
        imageRip = iiPR.getImage();

        this.puntos = puntos;
        this.x = x;
        this.y = y;
    }

    /**
     * Comprueba si el proximo movimiento es posible, avanza las coordenadas,
     * pinta, y si se encuentra un punto o galleta, actualiza los parámetros y
     * situa un 0 en esa posición del mapa
     *
     * @param ultimaTeclaPulsada
     */
    public Mapa avanza(Mapa map, int ultimaTeclaPulsada) {
        if (!this.gameOver && !colision(map, ultimaTeclaPulsada)) {
            //avanzamos segun tecla
            if (ultimaTeclaPulsada == KeyEvent.VK_LEFT) {
                seleccionarImagenActual(KeyEvent.VK_LEFT); 
                this.x--;
            }
            if (ultimaTeclaPulsada == KeyEvent.VK_RIGHT) {                
                seleccionarImagenActual(KeyEvent.VK_RIGHT); 
                this.x++;
            }
            if (ultimaTeclaPulsada == KeyEvent.VK_UP) {              
                seleccionarImagenActual(KeyEvent.VK_UP); 
                this.y--;
            }
            if (ultimaTeclaPulsada == KeyEvent.VK_DOWN) {             
                seleccionarImagenActual(KeyEvent.VK_DOWN); 
                this.y++;
            }
            
//            PacmanSound.PACMAN_CHOMP.play(); 
            
            //actualizamos  pellets
            if (map.getElement(this.x, this.y) == '3') {
                this.puntos += PacmanUtils.PUNTO_PELLET;
                map.setElement('0', this.x, this.y);
                PacmanSound.PICKUP_PELLET.play(); 
            }

            //actualizamos  power pellets
            if (map.getElement(this.x, this.y) == '2') {
                this.ok = true;
                this.invulnerable = true;
                this.tInvulnerable = PacmanUtils.TMAX_INVULNERABLE;
                map.setElement('0', this.x, this.y);
                PacmanSound.PICKUP_POWER_PELLET.play();                  
            }

            //si vas al tunel sal por el otro lado
            if (map.getElement(this.x, this.y) == '=') {
//                map.setElement('=', this.x, this.y);
                if (this.x == PacmanUtils.COLUMNAS - 1) {
                    this.x = 1;
                } else {
                    this.x = PacmanUtils.COLUMNAS - 1;
                }

            }
        }

        return map;

    }

    /**
     * Comprueba que en el proximo movimiento no haya un obstáculo
     *
     * @param ultimaTeclaPulsada
     * @return
     */
    private boolean colision(Mapa mapa, int ultimaTeclaPulsada) {
        boolean ok = false;
        boolean border = (x >= 0 && x < PacmanUtils.COLUMNAS && y >= 0 && y < PacmanUtils.FILAS);
        if (ultimaTeclaPulsada == KeyEvent.VK_LEFT && border) {
            ok = mapa.getElement(this.x - 1, this.y) == '1';
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_RIGHT && border) {
            ok = mapa.getElement(this.x + 1, this.y) == '1';
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_UP && border) {
            ok = mapa.getElement(this.x, this.y - 1) == '1';
        }
        if (ultimaTeclaPulsada == KeyEvent.VK_DOWN && border) {
            ok = mapa.getElement(this.x, this.y + 1) == '1';
        }

        return ok;
    }

    /**
     * Situa a pacman en la posición de inicio (10,15), vulnerable.
     */
    public void reiniciar() {
        this.invulnerable = false;
        this.tInvulnerable = 0;
        this.puntos = 0;
        this.ok = true;
        this.x = 10;
        this.y = 15;
        this.vidas = 2;
        this.gameOver = false;
        this.winner = false;
    }
    
     /**
     * Pinta pacman normal o ko
     *
     * @param tecla
     */
    private void seleccionarImagenActual(int tecla) {
        if (tecla == KeyEvent.VK_LEFT) {
            if (this.ok) {
                this.imagenActual = this.imageL;
            } else {
                this.imagenActual = this.imageKoL;
            }
        }
        if (tecla == KeyEvent.VK_RIGHT) {
            if (this.ok) {
                this.imagenActual = this.imageR;
            } else {
                this.imagenActual = this.imageKoR;
            }
        }
        if (tecla == KeyEvent.VK_UP) {
            if (this.ok) {
                this.imagenActual = this.imageU;
            } else {
                this.imagenActual = this.imageKoU;
            }
        }
        if (tecla == KeyEvent.VK_DOWN) {
            if (this.ok) {
                this.imagenActual = this.imageD;

            } else {
                this.imagenActual = this.imageKoD;

            }
        }
    }


    //getters && setters
    public int getPuntos() {
        return puntos;
    }

    public void setPuntos(int puntos) {
        this.puntos = puntos;
    }

    public boolean isInvulnerable() {
        return invulnerable;
    }

    public void setInvulnerable(boolean invulnerable) {
        this.invulnerable = invulnerable;
    }

    public int getTInvulnerable() {
        return tInvulnerable;
    }

    public void setTInvulnerable(int tInvulnerable) {
        this.tInvulnerable = tInvulnerable;
    }

    public Image getImageR() {
        return imageR;
    }

    public Image getImageL() {
        return imageL;
    }

    public Image getImageU() {
        return imageU;
    }

    public Image getImageD() {
        return imageD;
    }

    public Image getImageRip() {
        return imageRip;
    }

    public void setImageRip(Image imageRip) {
        this.imageRip = imageRip;
    }

    public Image getImagenActual() {
        return imagenActual;
    }

//    public int getX() {
//        return x;
//    }
//
//    public int getY() {
//        return y;
//    }
//     public void setX(int x) {
//        this.x = x;
//    }
//
//    public void setY(int y) {
//        this.y = y;
//    }

    public boolean isOk() {
        return ok;
    }

    public void setOk(boolean ok) {
        this.ok = ok;
    }

    public int getVidas() {
        return vidas;
    }

    public void setVidas(int vidas) {
        this.vidas = vidas;
    }

    public boolean isGameOver() {
        return gameOver;
    }

    public void setGameOver(boolean gameOver) {
        this.gameOver = gameOver;
    }

    public boolean isWinner() {
        return winner;
    }

    public void setWinner(boolean winner) {
        this.winner = winner;
    }

    
}
